package com.gzx.plugin.fin.tech.service.impl;

import cn.hutool.core.collection.CollectionUtil;
import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONObject;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.gzx.plugin.fin.tech.dto.GzxBlackRespDto;
import com.gzx.plugin.fin.tech.entity.GzxBlackList;
import com.gzx.plugin.fin.tech.service.GzxBlackListDbService;
import com.gzx.plugin.fin.tech.service.GzxBlackListService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import vip.xiaonuo.common.util.CommonCryptogramUtil;
import vip.xiaonuo.common.util.CommonHttpUtil;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @author zjt
 * @description
 * @date 2025/5/19 18:32
 */
@Slf4j
@Service
@RequiredArgsConstructor
public class GzxBlackListServiceImpl implements GzxBlackListService {

    @Value("${black.xf.url}")
    private String url;

    @Value("${black.xf.ak}")
    private String ak;

    @Value("${black.xf.call-id}")
    private String callId;

    @Value("${black.xf.poly}")
    private String poly;

    private final GzxBlackListDbService blackListDbService;

    /**
     * 校验黑名单
     */
    @Override
    public String verifyBlack(List<String> phoneList) {
        if (CollectionUtil.isNotEmpty(phoneList)) {
            //查询手机号是否已经查过
            List<GzxBlackRespDto.DataResp> dataRespList = setRespList(phoneList);
            List<String> fromDbPhoneList = dataRespList.stream().map(GzxBlackRespDto.DataResp::getCallee).toList();
            phoneList.removeAll(fromDbPhoneList);
            GzxBlackRespDto result = new GzxBlackRespDto();
            result.setErrno(0);
            result.setData(dataRespList);
            if (CollectionUtil.isNotEmpty(phoneList)) {
                Map<String, Object> bodyMap = new HashMap<>();
                bodyMap.put("ak", ak);
                bodyMap.put("callId", callId);
                bodyMap.put("callees", phoneList);
                bodyMap.put("poly", poly);
                bodyMap.put("sign", CommonCryptogramUtil.doMd5(ak + callId));
                try {
                    String resp = CommonHttpUtil.post(url, null, JSON.toJSONString(bodyMap), "南京先丰黑名单校验");
                    GzxBlackRespDto blackRespDto = JSONObject.parseObject(resp, GzxBlackRespDto.class);
                    if (blackRespDto != null && blackRespDto.getErrno() == 0 && CollectionUtil.isNotEmpty(blackRespDto.getData())) {
                        //异步入库
                        Thread.startVirtualThread(() -> blackListDbService.saveBatch(1, blackRespDto.getData()));
                        result.getData().addAll(blackRespDto.getData());
                    }
                } catch (Exception e) {
                    log.error("南京先丰黑名单校验出现异常：", e);
                }
            }
            return JSON.toJSONString(result);
        }
        return null;
    }

    private List<GzxBlackRespDto.DataResp> setRespList(List<String> phoneList) {
        List<GzxBlackList> blackList = blackListDbService.selectList(Wrappers.<GzxBlackList>lambdaQuery()
                .in(GzxBlackList::getPhone, phoneList));
        List<GzxBlackRespDto.DataResp> dataRespList = new ArrayList<>();
        for (GzxBlackList black : blackList) {
            GzxBlackRespDto.DataResp dataResp = new GzxBlackRespDto.DataResp();
            dataResp.setCallee(black.getPhone());
            dataResp.setForbid(black.getIsBlack());
            dataRespList.add(dataResp);
        }
        return dataRespList;
    }

    public static void main(String[] args) {
        List<String> aa = new ArrayList<>();
        aa.add("15850039044");
        aa.add("18573188027");
        aa.add("15978678614");
        aa.add("15195624885");
        aa.add("17631196760");
        aa.add("15641481355");
        aa.add("13583297722");
        aa.add("15527941373");
        aa.add("13628767997");
        aa.add("18560685077");
        aa.add("18121424799");
        aa.add("13767798781");
        aa.add("13643697701");
        aa.add("15098439261");
        aa.add("15855226662");
        aa.add("15882004854");
        aa.add("13696730126");
        aa.add("15182529634");
        aa.add("18605136655");
        aa.add("18343643741");
        aa.add("18230353931");
        aa.add("15005639828");
        aa.add("15283536010");
        aa.add("15606931389");
        aa.add("15850404120");
        aa.add("13681524544");
        aa.add("13661208210");
        aa.add("18257152375");
        aa.add("15666596780");
        aa.add("18281002741");
        aa.add("13488959998");
        aa.add("13677054421");
        aa.add("13932220088");
        aa.add("13879319625");
        aa.add("13554316377");
        aa.add("18850315313");
        aa.add("13988527655");
        aa.add("15769467667");
        aa.add("13459830001");
        aa.add("13167255343");
        aa.add("15882199014");
        aa.add("153****2354");
        aa.add("13691299729");
        aa.add("13162551357");
        aa.add("15608206825");
        aa.add("15050553972");
        aa.add("13763058616");
        aa.add("15850949264");
        aa.add("17884103376");
        aa.add("15153322217");
        aa.add("13806641239");
        aa.add("15985754398");
        aa.add("15767252400");
        aa.add("13045263555");
        aa.add("150****5807");
        aa.add("15985754398");
        aa.add("15265996001");
        aa.add("18634299186");
        aa.add("13597511440");
        aa.add("13760085027");
        aa.add("18610698505");
        aa.add("13984181111");
        aa.add("15011870814");
        aa.add("15366325828");
        aa.add("17389156563");
        aa.add("18795758892");
        aa.add("13993426745");
        aa.add("15674504769");
        aa.add("18774877642");
        aa.add("19983693939");
        aa.add("18652352294");
        aa.add("15242889957");
        aa.add("15019279378");
        aa.add("18257762858");
        aa.add("18295479129");
        aa.add("18241217473");
        aa.add("13401654042");
        aa.add("18094448089");
        aa.add("18292980164");
        aa.add("15267008056");
        aa.add("11");
        aa.add("13765480901");
        aa.add("18662617070");
        aa.add("13506482968");
        aa.add("13754397431");
        aa.add("15841175730");
        aa.add("15078260973");
        aa.add("18826807507");
        aa.add("13766066360");
        aa.add("13613657498");
        aa.add("18504343032");
        aa.add("15937227789");
        aa.add("18313858632");
        aa.add("15358379008");
        aa.add("15806035972");
        aa.add("18607266198");
        aa.add("13048568388");
        aa.add("13658921120");
        aa.add("13805140384");
        aa.add("15326911230");
        aa.add("15000306818");
        aa.add("17633577922");
        aa.add("13222483745");
        aa.add("17633577922");
        aa.add("18062249544");
        aa.add("17302386593");
        aa.add("18183656710");
        aa.add("15230235376");
        aa.add("18751801811");
        aa.add("15848903625");
        aa.add("18005728998");
        aa.add("18005728998");
        aa.add("13576369340");
        aa.add("15901888311");
        aa.add("13512410128");
        aa.add("15632261228");
        aa.add("15029494500");
        aa.add("17728480936");
        aa.add("13480233532");
        aa.add("17647619772");
        aa.add("18688928183");
        aa.add("18297399118");
        aa.add("19862248322");
        aa.add("13823266646");
        aa.add("13904542117");
        aa.add("13904542117");
        aa.add("13237706878");
        aa.add("18545868899");
        aa.add("13718593286");
        aa.add("15029494500");
        aa.add("17629269491");
        aa.add("15888543604");
        aa.add("13697492527");
        aa.add("15555973667");
        aa.add("13734131473");
        aa.add("18629901884");
        aa.add("17545547605");
        aa.add("18607266198");
        aa.add("13428028949");
        aa.add("15867001221");
        aa.add("13222483745");
        aa.add("15153339116");
        aa.add("13686961366");
        aa.add("13874535610");
        aa.add("13428028949");
        aa.add("13734131473");
        aa.add("13428028949");
        aa.add("18666381251");
        aa.add("13293381501");
        aa.add("18379016141");
        aa.add("15064599160");
        aa.add("18251856320");
        aa.add("19996712456");
        aa.add("13911002170");
        aa.add("17545547605");
        aa.add("18627939021");
        aa.add("17545547605");
        aa.add("15882906350");
        aa.add("15591000308");
        aa.add("13175890378");
        aa.add("13928965101");
        aa.add("13589061977");
        aa.add("18080786395");
        aa.add("13524574313");
        aa.add("13326139768");
        aa.add("17778920572");
        aa.add("13722358133");
        aa.add("15984548065");
        aa.add("18202392311");
        aa.add("13502156460");
        aa.add("13410002515");
        aa.add("18125059586");
        aa.add("15359817542");
        aa.add("15822432016");
        aa.add("13913143003");
        aa.add("18780051562");
        aa.add("15175800009");
        aa.add("13913959313");
        aa.add("15711188252");
        aa.add("18763905950");
        aa.add("15908493611");
        aa.add("18620461217");
        aa.add("15711188252");
        aa.add("18905330903");
        aa.add("13424688168");
        aa.add("18742525974");
        aa.add("18520056141");
        aa.add("15552168428");
        aa.add("17614770622");
        aa.add("15822315324");
        aa.add("19846355521");
        aa.add("13975377392");
        aa.add("18874997887");
        aa.add("19333981666");
        aa.add("18935499071");
        aa.add("18858779996");
        aa.add("18311156132");
        aa.add("13603739128");
        aa.add("13916944537");
        aa.add("13417358279");
        aa.add("13417358279");
        aa.add("15621101315");
        aa.add("18050822102");
        aa.add("17882649224");
        aa.add("17707945768");
        aa.add("13839731799");
        aa.add("15617567168");
        aa.add("17724226256");
        aa.add("18853727166");
        aa.add("18660011023");
        aa.add("15624165589");
        aa.add("18799161905");
        aa.add("18710382368");
        aa.add("18562666282");
        aa.add("15085470026");
        aa.add("15006962312");
        aa.add("18208309390");
        aa.add("15333359477");
        aa.add("13502573602");
        aa.add("18562666282");
        aa.add("18743870187");
        aa.add("13364537887");
        aa.add("13072372396");
        aa.add("18326621665");
        aa.add("15050605668");
        aa.add("19310890077");
        aa.add("18905198953");
        aa.add("15927288600");
        aa.add("13722111566");
        aa.add("15088986035");
        aa.add("15042006047");
        aa.add("18565390739");
        aa.add("15101198237");
        aa.add("18995649695");
        aa.add("13081833177");
        aa.add("19102578315");
        aa.add("13520805182");
        aa.add("15203748612");
        aa.add("13425516363");
        aa.add("15195537731");
        aa.add("17878428452");
        aa.add("09164815320");
        aa.add("17391311133");
        aa.add("19153696690");
        aa.add("17790235385");
        aa.add("13884208442");
        aa.add("17878428452");
        aa.add("13505299082");
        aa.add("18359799200");
        aa.add("15584668800");
        aa.add("18610587661");
        aa.add("13363632682");
        aa.add("13803318967");
        Map<String, Object> bodyMap = new HashMap<>();
        bodyMap.put("ak", "7253dd940aa0d9989cfb6c0c02560b66");
        bodyMap.put("callId", "zjgzxy1");
        bodyMap.put("callees", aa);
        bodyMap.put("poly", "MuMLbC");
//        bodyMap.put("poly", "OXrHJ8");
        bodyMap.put("sign", CommonCryptogramUtil.doMd5("7253dd940aa0d9989cfb6c0c02560b66zjgzxy1"));
        String resp = CommonHttpUtil.post("39.101.173.154:9769/filter", null, JSON.toJSONString(bodyMap), "");
        GzxBlackRespDto blackRespDto = JSONObject.parseObject(resp, GzxBlackRespDto.class);
        List<String> blackList = blackRespDto.getData().stream()
                .filter(dataResp -> dataResp.getForbid() == 1)
                .map(GzxBlackRespDto.DataResp::getCallee)
                .toList();
        List<String> whiteList = blackRespDto.getData().stream()
                .filter(dataResp -> dataResp.getForbid() == 0)
                .map(GzxBlackRespDto.DataResp::getCallee)
                .toList();
        System.out.println("黑名单");
        System.out.println(blackList);
        System.out.println("白名单");
        System.out.println(whiteList);
    }
}
